home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / DEMOS / RT_AZ.ZIP / COMPO.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-08-21  |  5.5 KB  |  217 lines

  1. {$A-,B-,D+,E+,F-,G+,I-,L+,N-,O-,P-,Q-,R-,S-,T-,V-,X+}
  2. {$M 16384,0,655360}
  3. const
  4.     ON          = true;
  5.     OFF         = false;
  6. type
  7.     pArrOfByte  = ^tArrOfByte;
  8.     tArrOfByte  = array[0..65000] of Byte;
  9.     tVGApalette = array[0..256*3-1] of Byte;
  10.     tCEL        = record
  11.                    Picture : pArrOfByte;
  12.                    Palette : pArrOfByte;
  13.                   end;
  14.  
  15. var CEL         : tCEL;
  16.     Palette     : tVGApalette;
  17.     SinTable    : array[0..255] of Word;
  18.  
  19. Function ReadKey : Word; assembler;
  20. asm
  21.                 xor     ax,ax
  22.                 int     16h
  23. end;
  24.  
  25. Procedure InitMode; assembler;
  26. asm             mov     ax,0013h
  27.                 int     10h
  28. end;
  29.  
  30. Procedure SetVGApalette(var Palette; StartCol,Num : Word); assembler;
  31. asm             les     si,Palette
  32.                 mov     ax,StartCol
  33.                 mov     bx,ax
  34.                 shl     ax,1
  35.                 add     si,ax
  36.                 add     si,bx
  37.                 mov     cx,Num
  38.                 mov     bx,cx
  39.                 shl     cx,1
  40.                 add     cx,bx
  41.                 mov     dx,03DAh
  42. @@w1:           in      al,dx
  43.                 test    al,8
  44.                 jnz     @@w1
  45. @@w2:           in      al,dx
  46.                 test    al,8
  47.                 jz      @@w2
  48.                 mov     dx,03C8h
  49.                 mov     ax,StartCol
  50.                 out     dx,al
  51.                 inc     dx
  52.                 SegES   rep outsb
  53. end;
  54.  
  55. Procedure FadeIn(Scale : Word);
  56. var I : Integer;
  57. begin
  58.  For I := 0 to 767 do
  59.   Palette[I] := Scale * CEL.Palette^[I] div 64;
  60.  SetVGApalette(Palette, 0, 256);
  61. end;
  62.  
  63. Function LoadCEL(const fName : String) : boolean;
  64. var F : File;
  65. begin
  66.  LoadCEL := OFF;
  67.  Assign(F, fName); Reset(F, 1);
  68.  if ioResult <> 0 then Exit;
  69.  GetMem(CEL.Picture, 320*200);
  70.  GetMem(CEL.Palette, 256*3);
  71.  if CEL.Picture = nil then Exit;
  72.  if CEL.Palette = nil then Exit;
  73.  Seek(F, 32); {Skip header}
  74.  BlockRead(F, CEL.Palette^, 768);
  75.  BlockRead(F, CEL.Picture^, 320*200);
  76.  if ioResult <> 0
  77.   then begin Close(F); Exit; end;
  78.  Close(F);
  79.  LoadCEL := ON;
  80. end;
  81.  
  82. Procedure ShowLine(srcLine,dstX,dstY : Integer; Scale : Word); assembler;
  83. var lStart : Word;
  84.     sDelta : Byte;
  85. asm             cld
  86.                 push    ds
  87.                 mov     ax,dstY
  88.                 cmp     ax,199
  89.                 ja      @@locEx
  90.                 cmp     Scale,2
  91.                 jb      @@locEx
  92.                 mov     es,segA000
  93.                 lds     si,CEL.Picture
  94.                 mov     cx,320
  95.                 mov     ax,cx
  96.                 mul     srcLine
  97.                 add     si,ax
  98.                 mov     ax,cx
  99.                 mul     dstY
  100.                 mov     di,ax
  101.                 mov     lStart,ax
  102.                 mov     bx,dstX
  103.                 mov     dx,0001h
  104.                 mov     ax,4000h
  105.                 div     Scale
  106.                 mov     cx,ax
  107.                 test    cx,cx
  108.                 jz      @@locEx
  109.  
  110.                 mov     sDelta,0
  111.                 cmp     dstX,-1
  112.                 jne     @@noCenter
  113.                 mov     ax,320
  114.                 sub     ax,cx
  115.                 sar     ax,1
  116.                 inc     ax
  117.                 add     bx,ax
  118.  
  119. @@noCenter:     test    bx,bx
  120.                 jns     @@noClipL
  121.                 mov     ax,bx
  122.                 neg     ax
  123.                 sub     cx,ax
  124.                 jle     @@locEx
  125.                 mul     Scale
  126.                 mov     sDelta,al
  127.                 mov     al,ah
  128.                 mov     ah,dl
  129.                 add     si,ax
  130.                 xor     bx,bx
  131. @@noClipL:      mov     ax,320
  132.                 sub     ax,dstX
  133.                 cmp     ax,cx
  134.                 ja      @@noClipR
  135.                 mov     cx,ax
  136.                 jcxz    @@locEx
  137. @@noClipR:      push    cx
  138.                 mov     cx,bx
  139.                 xor     ax,ax
  140.                 shr     cx,1
  141.                 rep     stosw
  142.                 adc     cl,cl
  143.                 rep     stosb
  144. @@noFillL:      pop     cx
  145.                 mov     dx,Scale
  146.                 mov     bh,sDelta
  147.                 mov     bl,dl
  148.                 mov     dl,dh
  149.                 mov     dh,0
  150. @@scale:        mov     al,[si]
  151.                 add     bh,bl
  152.                 adc     si,dx
  153.                 stosb
  154.                 loop    @@scale
  155.  
  156.                 xor     ax,ax
  157.                 mov     cx,lStart
  158.                 add     cx,320
  159.                 sub     cx,di
  160.                 jle     @@locEx
  161.                 shr     cx,1
  162.                 rep     stosw
  163.                 adc     cl,cl
  164.                 rep     stosb
  165.  
  166. @@locEx:        pop     ds
  167. end;
  168.  
  169. Procedure ShowCELmode1;
  170. var Y,CSP,CDS,SP : Integer;
  171. begin
  172.  InitMode;
  173.  For Y := 10 to 256 do
  174.   begin
  175.    FadeIn(Y div 4);
  176.    For CSP := 0 to 199 do
  177.     ShowLine(CSP, -1, CSP, Y);
  178.   end;
  179.  readkey;
  180. end;
  181.  
  182. Procedure ShowCELmode2;
  183. var Y,SP : Integer;
  184. begin
  185.  InitMode;
  186.  For Y := -320 to 320 do
  187.   begin
  188.    FadeIn((320-abs(Y)) * 64 div 320);
  189.    For SP := 0 to 199 do
  190.     ShowLine(SP, Y, SP, 256);
  191.   end;
  192.  readkey;
  193. end;
  194.  
  195. Procedure InitViewer;
  196. var I : Word;
  197. begin
  198.  For I := 0 to 255 do
  199.   SinTable[I] := Round(Sin(I * (2 * pi) / 256) * 16384);
  200. end;
  201.  
  202. begin
  203.  if paramCount <> 1
  204.   then begin
  205.         Writeln('Usage: Show <filename.cel>');
  206.         Halt(1);
  207.        end;
  208.  if not LoadCEL(ParamStr(1))
  209.   then begin
  210.         Writeln('Cannot load picture file');
  211.         Halt(1);
  212.        end;
  213.  InitViewer;
  214.  ShowCELmode1;
  215.  ShowCELmode2;
  216. end.
  217.